package com.itany.nmms.service.impl;

import com.itany.nmms.constant.DictConstant;
import com.itany.nmms.dao.ProductMapper;
import com.itany.nmms.dao.SequenceMapper;
import com.itany.nmms.entity.Product;
import com.itany.nmms.entity.ProductExample;
import com.itany.nmms.entity.Sequence;
import com.itany.nmms.entity.SequenceExample;
import com.itany.nmms.exception.FileUploadErrorException;
import com.itany.nmms.exception.ProductExistException;
import com.itany.nmms.exception.RequestParamErrorException;
import com.itany.nmms.service.ProductService;
import com.itany.nmms.util.ParameterUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * Author:shixiaojun@itany.com
 * Date:2022/8/3 13:43
 * Version:1.0-SNAPSHOT
 * Description:
 */
@Service
@Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
public class ProductServiceImpl implements ProductService {

    @Autowired
    private ProductMapper productMapper;

    @Autowired
    private SequenceMapper sequenceMapper;


    @Override
    public void addProduct(String name, String price, CommonsMultipartFile file, String typeId, HttpSession session) throws RequestParamErrorException, ProductExistException, FileUploadErrorException {
        if(ParameterUtil.isNull(name) || ParameterUtil.isNull(price) || ParameterUtil.isNull(typeId) || file.isEmpty()){
            throw new RequestParamErrorException("请求参数有误");
        }
        // 同一种类型的商品名称不能重复
        ProductExample productExample = new ProductExample();
        productExample.or()
                .andNameEqualTo(name)
                .andProductTypeIdEqualTo(Integer.parseInt(typeId));
        List<Product> products = productMapper.selectByExample(productExample);
        if(!products.isEmpty()){
            throw new ProductExistException("该类型的商品已经存在");
        }

        // 创建一个商品对象,用于保存操作
        Product product = new Product();
        product.setName(name);
        product.setPrice(Double.parseDouble(price));
        product.setProductTypeId(Integer.parseInt(typeId));

        // 生成商品编号
        // 判断是否生成过商品编号
        // 根据商品编号的标志位去序列号表中进行查询
        SequenceExample example = new SequenceExample();
        example.or()
                .andNameEqualTo(DictConstant.PRODUCT_NO_PREFIX);
        List<Sequence> sequences = sequenceMapper.selectByExample(example);
        if(sequences.isEmpty()){
            // 如果没有查询到对应的数据
            // 说明尚未生成过商品编号
            // 创建一个初始值
            Sequence sequence = new Sequence();
            sequence.setName(DictConstant.PRODUCT_NO_PREFIX);
            sequence.setValue(DictConstant.PRODUCT_NO_SEQUENCE_INIT_VALUE);
            // 执行保存操作
            sequenceMapper.insertSelective(sequence);
            // 生成对应的商品编号
            product.setProductNo(DictConstant.PRODUCT_NO_PREFIX+new SimpleDateFormat("yyyyMMdd").format(new Date())+sequence.getValue());
        } else{
            // 如果查询到对应的数据,说明不是第一次生成
            // 且此时查询到的数据一定是有且仅有一条数据
            // 取出这一条数据
            Sequence sequence = sequences.get(0);
            // 判断当前序列号的值是否达到了最大值
            if(DictConstant.PRODUCT_NO_SEQUENCE_MAX_VALUE.equals(sequence.getValue())){
                // 如果达到了最大值,则下一个值为初始值
                sequence.setValue(DictConstant.PRODUCT_NO_SEQUENCE_INIT_VALUE);
            } else{
                // 如果没有达到最大值,则下一个值为:当前值+1,保持格式不变
                sequence.setValue(ParameterUtil.nextValue(sequence.getValue()));
            }

            // 执行修改操作
            sequenceMapper.updateByPrimaryKeySelective(sequence);
            // 生成对应的商品编号
            product.setProductNo(DictConstant.PRODUCT_NO_PREFIX+new SimpleDateFormat("yyyyMMdd").format(new Date())+sequence.getValue());
        }

        // 上传商品图片
        // 保存到数据库中的相对路径,相对于服务器根目录的路径
        String path = DictConstant.PRODUCT_IMAGE_ROOT_FOLDER + new SimpleDateFormat("yyyyMMdd").format(new Date());
        // 上传的图片目录的绝对路径
        String cp = session.getServletContext().getRealPath(path);
        // 创建对应的目录
        File f = new File(cp);
        f.mkdirs();

        // 对文件名进行处理,在文件名末尾添加毫秒数,防止重名
        String fileName = file.getOriginalFilename();
        fileName = fileName.substring(0,fileName.lastIndexOf("."))+"-"+new Date().getTime()+fileName.substring(fileName.lastIndexOf("."));

        // 将相对路径+文件名保存到数据库中
        product.setImage(path+"/"+fileName);

        try {
            // 添加商品信息
            productMapper.insertSelective(product);
            // 上传图片
            file.transferTo(new File(cp,fileName));
        } catch (IOException e) {
            throw new FileUploadErrorException("文件上传失败");
        }


    }
}
